#include <my_head.h>

int main(int argc, const char *argv[]){
    if(2 != argc){
        printf("Usage : %s <file_server>\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    // 创建套接字
    int sockfd = socket(AF_LOCAL, SOCK_DGRAM, 0);
    if(-1 == sockfd)
        ERR_LOG("socket error");
    
    // 填充服务器本地结构体
    struct sockaddr_un serveraddr;
    serveraddr.sun_family = AF_UNIX;
    strcpy(serveraddr.sun_path, argv[1]);
    socklen_t serveraddr_len = sizeof(serveraddr);

    // 将套接字和服务器网络信息结构体绑定
    if(-1 == bind(sockfd, (struct sockaddr *)&serveraddr, serveraddr_len))
        ERR_LOG("bind error");

    // 定义结构体 保存客户端的信息
    // UDP的服务器如果不保存客户端的本地信息结构体 
    // 接收客户端发来的消息是没问题的 但是没法给客户端回信 因为sendto的后两个参数没法填
    // 且如果想保存客户端的结构体 还需要客户端也调用bind
    struct sockaddr_un clientaddr;
    socklen_t clientaddr_len = sizeof(clientaddr);

    int nbytes = 0;
    char buff[128] = {0};
    while(1){
        // 收发数据
        // 接收客户端发来的数据
        if(-1 == recvfrom(sockfd, buff, sizeof(buff), 0, (struct sockaddr *)&clientaddr, &clientaddr_len)){
            ERR_LOG("recvfrom error");
        }
        // 处理数据（打印到终端）
        printf("客户端[%s]发来数据[%s]\n", clientaddr.sun_path, buff);
        // 组装应答消息
        strcat(buff, "--beijing");
        // 给客户端发送应答消息
        if(-1 == sendto(sockfd, buff, sizeof(buff), 0, (struct sockaddr *)&clientaddr, clientaddr_len)){
            ERR_LOG("sendto error");
        }
    }
    // 关闭套接字
    close(sockfd);

    return 0;
}